package com.tom.architect.party3.day29;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.widget.ImageView;

import com.tom.architect.R;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import androidx.appcompat.app.AppCompatActivity;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

// 使用RxJava实现。1.子线程下载图片; 添加水印; 切换到子线程显示图片。
public class MainActivity291 extends AppCompatActivity {
    // 给网络上的一张图片加水印，显示到 ImageView 控件上
    private ImageView mImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main29);
        mImageView = (ImageView) findViewById(R.id.image);
        String urlStr = "http://pic-bucket.ws.126.net/photo/0003/2024-01-12/IO8BIBJV00AJ0003NOS.jpg";

        // 优点: 可读性比较高。一条链子下来的，扩展性、维护性比较高。
        Observable.just(urlStr)
                .map(new Function<String, Bitmap>() { // 事件的变换，String变成 Bitmap
                    @Override
                    public Bitmap apply(String urlPath) throws Exception {
                        // 1.URL下载图片
                        URL url = new URL(urlPath);
                        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                        InputStream inputStream = urlConnection.getInputStream();
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        return bitmap;
                    }
                })
                .map(new Function<Bitmap, Bitmap>() { // 输入Bitmap，输出Bitmap
                    @Override
                    public Bitmap apply(Bitmap bitmap) throws Exception {
                        // 2.加一个水印(中间可以添加图片缓存...)
                        bitmap = createWatermark(bitmap, "2 RxJava2.0");
                        return bitmap;
                    }
                })
                .subscribeOn(Schedulers.io()) // 代表之前的所有方法，都在子线程执行。
                .observeOn(AndroidSchedulers.mainThread()) // observe执行在主线程(切换到主线程)。
                .subscribe(new Consumer<Bitmap>() {
                    @Override
                    public void accept(Bitmap bitmap) throws Exception {
                        // 3.显示图片到UI
                        mImageView.setImageBitmap(bitmap);
                    }
                });
        // 事件流：url--》map(String->Bitmap 下载图片)--> map(bitmap->bitmap 加水印)
        // -> subscribeOn --> observeOn --> subscribe显示图片。
    }

    private Bitmap createWatermark(Bitmap bitmap, String mark) {
        int w = bitmap.getWidth();
        int h = bitmap.getHeight();
        Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bmp);
        Paint p = new Paint();
        // 水印颜色
        p.setColor(Color.parseColor("#C5FF0000"));
        // 水印字体大小
        p.setTextSize(150);
        //抗锯齿
        p.setAntiAlias(true);
        //绘制图像
        canvas.drawBitmap(bitmap, 0, 0, p);
        //绘制文字
        canvas.drawText(mark, 0, h / 2, p);
        canvas.save();
        canvas.restore();
        return bmp;
    }

}
